import datetime
import random
import time

import requests

import requests
import json  # 用于处理JSON解析（可选，requests自带json()方法，此处备用）

def check_camera_status(camera_id, api_url):
    """
    检测相机接口状态，判断相机可用性并提取相机名称
    :param api_url: 目标接口地址
    :return: 字典（包含is_success接口是否成功、camera_available相机是否可用、camera_name相机名称、error_msg错误信息）
    """
    # 1. 模拟浏览器请求头：避免服务器识别为爬虫而拒绝请求
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Accept": "application/json, text/javascript, */*; q=0.01",  # 声明接收JSON格式响应
        "Content-Type": "application/json; charset=UTF-8"
    }

    try:
        # 2. 发送GET请求（timeout=15：15秒无响应则判定超时，防止程序阻塞）
        response = requests.get(
            url=api_url,
            headers=headers,
            timeout=15,
            verify=False  # 若接口存在SSL证书问题（如自签证书），可关闭验证（生产环境需谨慎）
        )

        # 3. 检查HTTP响应状态码（200表示请求成功送达服务器）
        if response.status_code != 200:
            return {
                "is_success": False,
                "camera_available": None,
                "camera_name": None,
                "error_msg": f"HTTP请求失败，状态码：{response.status_code}"
            }

        # 4. 解析响应为JSON格式（处理JSON解析失败的情况）
        try:
            response_json = response.json()  # requests自带的JSON解析方法
            # print(f"✅ 接口响应JSON：\n{json.dumps(response_json, indent=2, ensure_ascii=False)}")  # 格式化打印JSON（方便调试）
        except json.JSONDecodeError as e:
            return {
                "is_success": False,
                "camera_available": None,
                "camera_name": None,
                "error_msg": f"JSON解析失败：{str(e)}，原始响应内容：{response.text[:200]}..."  # 只显示前200字符避免过长
            }

        # 5. 解析接口业务逻辑（根据code判断接口是否调用成功）
        interface_code = response_json.get("code")  # 获取code字段（若字段不存在，返回None）
        interface_msg = response_json.get("msg", "未知消息")  # 获取msg字段，默认值"未知消息"

        # 5.1 若接口返回错误（非code=0）
        if interface_code != 0:
            return {
                "is_success": False,
                "camera_available": None,
                "camera_name": None,
                "error_msg": f"接口业务报错，code：{interface_code}，msg：{interface_msg}"
            }

        # 5.2 若接口成功，提取data中的关键字段
        data = response_json.get("data", {})  # 获取data字段，默认空字典（避免KeyError）
        play_able = data.get("playAble", False)  # 相机是否可用（默认False，防止字段缺失）
        camera_name = data.get("cameraName", "未知相机名称")  # 相机名称（默认"未知相机名称"）
        media_url = data.get("mediaUrl", "")  # 相机名称（默认"未知相机名称"）

        # 5.3 判断相机可用性并返回结果
        camera_status = "可用" if play_able and media_url else "不可用"
        if "10017" in media_url:
            content = f"{camera_id}, {camera_name}, {response_json}"
            print(f"{content}")
            with open("./camera_ok.txt", "a", encoding="utf-8") as f:
                f.write(content + "\n")

        return {
            "is_success": True,
            "camera_available": play_able and media_url,
            "camera_name": camera_name,
            "error_msg": None,
            "camera_status_desc": f"相机【{camera_name}】当前状态：{camera_status}"
        }

    # 6. 捕获各类网络异常
    except requests.exceptions.ConnectionError:
        return {
            "is_success": False,
            "camera_available": None,
            "camera_name": None,
            "error_msg": "网络连接错误（可能是服务器未启动、IP/端口错误或网络不通）"
        }
    except requests.exceptions.Timeout:
        return {
            "is_success": False,
            "camera_available": None,
            "camera_name": None,
            "error_msg": "请求超时（服务器响应过慢，建议检查网络或服务器负载）"
        }
    except requests.exceptions.InvalidURL:
        return {
            "is_success": False,
            "camera_available": None,
            "camera_name": None,
            "error_msg": "URL格式无效（请检查接口地址是否正确，如http/https是否遗漏、端口是否正确）"
        }
    except requests.exceptions.SSLError:
        return {
            "is_success": False,
            "camera_available": None,
            "camera_name": None,
            "error_msg": "SSL证书验证失败（若为测试环境，可在requests.get中添加verify=False关闭验证）"
        }
    except Exception as e:
        # 捕获其他未预料的异常（如权限问题、服务器返回非JSON格式等）
        return {
            "is_success": False,
            "camera_available": None,
            "camera_name": None,
            "error_msg": f"未知错误：{str(e)}"
        }


def test_api():
    for i in range(10000, 20000):
        time.sleep(0.1)
        camera_id = i
        t = datetime.datetime.now().timestamp() * 1000
        # 目标接口地址（注意：t参数是时间戳，若接口要求实时时间戳，需动态生成，下方有说明）
        target_api = f"http://h5.kezantech.com:7060/media-server/camera/play/info?cameraId={camera_id}&platform=android&t={t}"

        # 调用检测函数
        result = check_camera_status(camera_id, target_api)

        # 打印最终结果（格式化输出，清晰易读）
        if result["is_success"] and result['camera_available']:
            pass
        else:
            print(f"{i}:  检测失败")


if __name__ == '__main__':
    test_api()

